package com.springbootdemo.demo.controller;

import com.springbootdemo.demo.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class RedisController {

    /**
     * Lettuce的好处（莱特斯替代Jedis）
     * Lettuce和Jedis的都是连接Redis Server的客户端程序。
     * Jedis在实现上是直连redis server，多线程环境下非线程安全，除非使用连接池，为每个Jedis实例增加物理连接。
     * Lettuce基于Netty的连接实例（StatefulRedisConnection），可以在多个线程间并发访问，且线程安全，满足多线程环境下的并发访问，
     * 同时它是可伸缩的设计，一个连接实例不够的情况也可以按需增加连接实例。
     */

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RedisTemplate<String, Object> redisCacheTemplate;

    @RequestMapping("saveToRedis")
    public void saveToRedis(){
        stringRedisTemplate.opsForValue().set("springBootKey", "哈哈！！");
    }

    @RequestMapping("getFromRedis")
    public String getFromRedis(){
        return stringRedisTemplate.opsForValue().get("springBootKey");
    }

    @RequestMapping("saveUserToRedis")
    public void saveUserToRedis(){
        redisCacheTemplate.opsForValue().set("user", new User("1", "KD", "35"));
    }

    @RequestMapping("getUserFromRedis")
    public User getUserFromRedis(){
        return (User) redisCacheTemplate.opsForValue().get("user");
    }

    @RequestMapping("saveMapToRedis")
    public void saveMapToRedis(){

        Map<String, Object> map = new HashMap<>();
        map.put("key1", "小明");
        map.put("key2", "小强");
        map.put("key3", "小红");
        redisCacheTemplate.opsForValue().set("redisMap", map);

    }


    @RequestMapping("getMapFromRedis")
    public Map<String, Object> getMapFromRedis(){
        return (Map<String, Object>) redisCacheTemplate.opsForValue().get("redisMap");
    }
}
